#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<iostream>
#include<vector>
#define N 10

int main()
{
    std::vector<pid_t> subids;
    int i=0;
    for(;i<N;i++)
    {
      pid_t id=fork();
      if(id==0)
      {
          int i=10;
          while(1)//(i)
          {
              printf("我是一个子进程，pid:%d,ppid:%d,count:%d\n",getpid(),getppid(),i);
              // sleep(3);
              // int *p=NULL;
              // *p=100;
              // int a=10;
              // a/=0;
              sleep(1);
              break;
              i--;
          }
          printf("子进程退出了\n");
          int ret=1;
          if(ret==0)
              exit(0);
          else
              exit(1);
          //exit(0);
      }
      subids.push_back(id);
    }

    sleep(5);
    for(auto&e:subids)//(i=0;i<N;i++)
    {
        int status=0;
        printf("父进程开始等待子进程ing...,%d\n",e);
        pid_t rid=waitpid(-1,&status,0);
        if(rid>0)
        {
            int exit_code=(status>>8)&0xFF;
            int exit_signal=status&0x7F;
            if(exit_code==0&&exit_signal==0)
                printf("子进程运行完毕，结果正确\n");
            else if(exit_code>0&&exit_signal==0)
                printf("子进程运行完毕，结果不正确:%d:%s\n",exit_code,strerror(exit_code));
            else 
            {

                printf("子进程出现异常了，exit_singal:%d\n",exit_signal);
            }
            //printf("父进程等待子进程成功，子进程pid:%d,status:%d,exit_code:%d,exit_signal:%d\n",rid,status,(status>>8)&0xFF,status&0x7F);

            //sleep(5);
        }
        else
        {
            printf("wait failed\n");
        }
    }

    return 0;
}

//int print()
//{
//    fprintf(stdout,"hello fprint()\n");
    
//    return 0;
    //exit(10);
    //return 10;
//}


//int main()
//{
//    printf("我是一个进程!");
//    print();
//    sleep(3);
//    _exit(1);
    
    
    //printf("hello iu\n");
    //printf("我的进程开始运行了\n");
    //sleep(1);
    //print();
    //printf("我的进程正常运行结束\n");
    //_exit(3);
    //exit(2);
    //return 1;
    
    //return 4;
//}
